'''
Created on 5 dec. 2014

@author: Damien Torond et Geoffrey Sentost
Module Acces
'''
from modele import Voiture, Teleporteur, Camera, BorneTicket, Client
from vue import PanneauAffichage

'''
import des modules Voiture, Teleporteur, Camera, BorneTicket, Client et PanneauAffichage;
'''
    
class Acces:
    
    '''
    La classe Acces modelise les deux entrees du parking, permettant ainsi
    de garer ou reprendre une voiture.
    '''

    def __init__(self, parking):
        '''
        Constructeur de la classe Acces.
        Instances :
            - parking de la classe Parking
            - panneau de la classe PanneauAffichage
            - teleporteurEntree et teleporteurSortie de la classe Teleporteur
            - camera de la classe Camera
            - borneTicket de la classe BorneTicket
        
        '''
        self.parking = parking
        self.panneau = PanneauAffichage.PanneauAffichage(self.parking)
        self.teleporteurEntree = Teleporteur.Teleporteur(1)
        self.teleporteurSortie = Teleporteur.Teleporteur(2)
        self.camera = Camera.Camera()
        self.borneTicket = BorneTicket.BorneTicket()
        
    
    
    def getAffichagePanneau(self):
        '''
         Methode : appel la methode getAffichage() de la classe PanneauAffichage.
        '''
        self.panneau.getAffichage()
    
        
    def lancerProcedureEntree(self, voiture, bdd):
        '''
        Methode : On lui passe en parametre une instance de voiture et de la base de donnees.
         
        Elle va lancer toute la procedure d'entree d'une voiture dans le garage, allumage de
        la camera pour capturer l'image de la voiture.
        
        On va aussi interagir avec la base de donnees pour ajouter une voiture et mettre a jour les donnees
        du client. On va gerer ainsi les interactions avec le client et la borne.
        
        Il faut ensuite gerer le super abonne qui aura une place attribue. On va ainsi gerer le placement
        en fonction de l'abonnement et du nombre de places libres. On verifiera si les teleporteurs sont
        libres ou non.
        
        On delivre ensuite le ticket au client qui recapitulera les informations du placement et la date de validite.
        '''
        
        self.camera.setActivationOn()
        image = self.camera.capturerImage(voiture)
        self.borneTicket.getEcran().immatCapture()
        self.camera.setActivationOff()
        
        self.borneTicket.getEcran().voitureSouhaiteRentree(voiture)
        
        idVoiture = bdd.getIdVoiture(image)
        self.panneau.getAffichage()
        
        if idVoiture == 0 :
            idVoiture = bdd.ajouterVoiture(voiture)
        
        client = bdd.renseignerStatutClient(voiture, idVoiture, self.parking.getListeAbo()) #soit client insere carte soit renseigne formulaire
        
        if client.getEstAbonne():
            self.borneTicket.demanderCarte(client, bdd)
        
        self.borneTicket.getEcran().renseignerStatutClient(client)
        
        if (client.getDevenirSuperAbo() and self.parking.peutEtrePlacee(voiture, bdd)) or (not client.getEstSuperAbonne() and self.parking.peutEtrePlacee(voiture, bdd)):
            self.parking.addPlacement(voiture, image, bdd) # assigne la place idéale
            self.borneTicket.getEcran().renseignerPlacement(voiture)
            self.borneTicket.delivrerTicket(voiture, bdd)
        
            #client donne ticket au teleporteur 
            if self.teleporteurEntree.getEstLibre() :
                self.teleporteurEntree.teleporterVersPlace(voiture, bdd, self.borneTicket.getEcran())
                client.setDevenirSuperAbo(False)
            else :
                self.borneTicket.getEcran().teleporteurOccupe()
        elif client.getEstSuperAbonne() and not client.getDevenirSuperAbo() and not voiture.getEstGaree() :
            self.parking.addPlacementSuperAbo(voiture, image, bdd)
            self.borneTicket.delivrerTicket(voiture, bdd)
            
            if self.teleporteurEntree.getEstLibre() :
                self.teleporteurEntree.teleporterVersPlace(voiture, bdd, self.borneTicket.getEcran())
            else :
                self.borneTicket.getEcran().teleporteurOccupe()
                
        else :
            if voiture.getEstGaree():
                self.borneTicket.getEcran().voitureDejaGaree()
            elif self.parking.estPlein():
                self.borneTicket.getEcran().parkingPlein()
            else :
                self.borneTicket.getEcran().pbDimensions()
       
        self.borneTicket.getEcran().etatVoiture(voiture)
    
    def lancerProcedureSortie(self, voiture, bdd):
        '''
        Methode : comme la precedente, elle attend une instance de voiture et de la base de donnees.
        
        Meme procedure mais pour la sortie en moins complete car il faut juste verifier que le 
        teleporteur est libre puis interagir avec la borne.
        '''
        self.borneTicket.getEcran().voitureSouhaiteSortir(voiture)
        if voiture.getEstGaree() : 
            if self.teleporteurSortie.getEstLibre() :
                self.teleporteurSortie.teleporterVersSortie(voiture, bdd, self.borneTicket.getEcran())
                self.parking.sortirPlace(voiture, bdd)
            else :
                self.borneTicket.getEcran().teleporteurOccupe()
        
        self.borneTicket.getEcran().etatVoiture(voiture)
